#include <QAction>
#include <QMenu>
#include <QFileDialog>
#include <QMetaType>
#include <QtDebug>
#include <QList>
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "file_content_processing/file_processing.h"
#include "data_processing/process_data_table_model.h"
#include "data/track_id_data_integrated.h"
#include "flight_track_widget.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , file_processing_(new File_processing(this))
    , model_(new Process_data_table_model(this))
{
    ui->setupUi(this);

    // 注册类型，确保模型model_在跨线程上的数据传输
    qRegisterMetaType<QList<QPersistentModelIndex > >("QList<QPersistentModelIndex >");
    qRegisterMetaType<QAbstractItemModel::LayoutChangeHint>("QAbstractItemModel::LayoutChangeHint");

    setup_widgets();
    setup_connections();

    // 关闭窗体后释放占用的资源，窗体必须是创建在堆上。在main.cpp文件中创建MainWindow指针
    setAttribute(Qt::WA_DeleteOnClose);
}

MainWindow::~MainWindow()
{
//    if (thread() == model_->thread()) {
//        delete model_;
//        model_ = nullptr;
//    }

//    model_thread_.quit();
//    model_thread_.wait();

    delete ui;
}

void MainWindow::closeEvent(QCloseEvent *ev)
{
    QMainWindow::closeEvent(ev);
}

void MainWindow::setup_widgets()
{
    file_menu_ = menuBar()->addMenu(tr("文件"));
    open_file_action_ = new QAction(tr("打开文件"), this);
    split_file_data_action_ = new QAction(tr("拆分数据"), this);
    exit_application_action_ = new QAction(tr("退出"), this);
    file_menu_->addAction(open_file_action_);
    file_menu_->addAction(split_file_data_action_);
    file_menu_->addSeparator();
    file_menu_->addAction(exit_application_action_);

    // 二次代码输入框的正则表达式，只能输入数字
    QRegExp ssr_code_reg("0|[1-9]\\d+$");
    ui->edit_ssr_code_->setValidator(new QRegExpValidator(ssr_code_reg, this));

    // 航班号输入框的正则表达式，只能输入字母和数字
    QRegExp flight_number_reg("^[A-Za-z0-9]+$");
    ui->edit_flight_number_->setValidator(new QRegExpValidator(flight_number_reg, this));

    // 设置滑动块范围
    ui->spin_box_min_altitude_->setRange(0, 15000);
    ui->spin_box_min_altitude_->setValue(0);
    ui->spin_box_max_altitude_->setRange(0, 15000);
    ui->spin_box_max_altitude_->setValue(15000);

    ui->tableView->setModel(model_);

    // 显示航迹目标
//    ui->scroll_area_->setWidget(new Flight_track_widget(this));
}

void MainWindow::setup_connections()
{
    // 点击按钮，打开对话框读取文件，将文件中的不同数据保存到不同文件中
    connect(split_file_data_action_, static_cast<void (QAction::*)(bool)>(&QAction::triggered),
            this, &MainWindow::open_dialog_to_split_file);

    // 点击按钮，打开对话框读取文件，将文件内容显示到窗体
    connect(open_file_action_, static_cast<void (QAction::*)(bool)>(&QAction::triggered),
            this, &MainWindow::open_dialog_to_read_data);

    // 点击按钮，将主窗体关闭
    connect(exit_application_action_, &QAction::triggered,
            qApp, &QApplication::closeAllWindows);

    // 将航班信息发送给模型
    connect(file_processing_,
            static_cast<void (File_processing::*)(Track_id_data_integrated*)>
            (&File_processing::sig_integrated_data),
            model_,
            static_cast<void (Process_data_table_model::*)(Track_id_data_integrated*)>
            (&Process_data_table_model::sig_get_track_data_integrated));
}

void MainWindow::open_dialog_to_split_file()
{
    QString file_name_and_path(QFileDialog::getOpenFileName(this, tr("打开文件")));

    if ( !file_name_and_path.isNull()) {
        file_processing_->open_file_to_split_data(file_name_and_path);
    }
}

void MainWindow::open_dialog_to_read_data()
{
    QStringList files_name_and_path(QFileDialog::getOpenFileNames(this, tr("打开文件")));

//    if ( !model_thread_.isRunning()) {
//        model_->moveToThread(&model_thread_);
//        model_thread_.start();
//    }

    if ( 0 != model_->rowCount()) {
        model_->reset_data_set();
    }

    if ( 0 != files_name_and_path.count()) {
        file_processing_->open_file_to_read_data(files_name_and_path);
    }
}

